﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using vudu.Presentacion.Contrato.VU_01_Gestionar_Salones;
using vudu.Logica.Fachada;
using vudu.ClasesDominio;
using System.Text.RegularExpressions;

namespace vudu.Presentacion.Presentador.VU_01_Gestionar_Salones
{
    public class PresentadorAgregarSalon
    {
        //Declaracion de variables
        public IContratoAgregarSalon _vista;
        private EnlaceLogico _fachada;
        private String _nombreSalon, _tipoSalon,_edificio;
        private int _capacidadSalon, _status;
        private Universidad _universidad;
        //Variables para marcar el exito o fallo de las validaciones
        public int _exito = 1;
        public int _fallo = 0;

        public PresentadorAgregarSalon(IContratoAgregarSalon vista, EnlaceLogico fachada)
        {
            //Inicializacion del EnlaceLogico,la vista y la universidad logeada en el constructor
            _universidad = (Universidad)fachada.RolActual;
            _vista = vista;
            _fachada = fachada;
            _vista.InfoUsuario.Text = _universidad.Nombre;
        }

        //Metodo que agrega el salon insertado
        public void AgregarSalon()
        {
            _status = 1;
            //Aqui se verifica si los datos estan correctos
            if (VerificarAgregar())
            {
                //Si los datos estan correctos se instancia un objeto de tipo salon y se le pasan 
                //los valores insertados por el usuario  a su constructor
                Salon miSalon = new Salon(_tipoSalon, _nombreSalon, _edificio, _capacidadSalon, _status);
                //Se llama a la Fachada Logica y se le pasa el objeto del salon a agregar y el id de la universidad
                //a la cual se asignara el salon
                int seAgrego = _fachada.AgregarSalon(miSalon,_universidad.IdUniv);
                //Si la variable seAgrego es igual a 0 significa que no se agrego
                if (seAgrego == 0)
                {
                    ocurreError("No es posible realizar la transaccion");
                    
                }
                else{
                    //Si la variable seAgrego es igual a -2 significa que el salon insertado existe en el edificio
                    //seleccionado
                    if (seAgrego == -2)
                        ocurreError("Nombre de salon repetido en el mismo Edificio");
                    //Sino es -2 y 0 entonces los datos fueron agregados correctamente
                    else
                        ocurreExito();
                }
            }
            else
            {
                ocurreError("Los datos presentan errores");
            }
        }

        //Metodo que verifica si hay errores en los campos, si no hay devuelve true.
        public bool VerificarAgregar()
        {

            int agregar = setNombre() * setEdificio() * setTipo() * setCapacidad();
            if (agregar == 1)
                return true;
            else
                return false;
        }

        #region Validaciones y obtencion de valores

        
        public int setNombre()
        {
            //Se inicializa la variable _nombreSalon con el nombre insertado por el usuario
            this._nombreSalon = _vista.NombreSalon.Text;
            //Se valida que el nombre no acepte caracteres especiales
            Regex rx = new Regex(@"[. $ ^ { [ ( | ) * + ? \ % ]");
            if (!rx.IsMatch(_nombreSalon))
            {
                //Se valida que el nombre del salon tenga un maximo de 20 caracteres
                if ((_nombreSalon.Length == 0) || (_nombreSalon.Length > 20))
                {
                    //Si tiene mas de 20 caracteres muestra un error
                    _vista.LNombre.ForeColor = System.Drawing.Color.Red;
                    return _fallo;
                }
                else
                {
                    //Sino devuelve 1 lo que significa exito
                    _vista.LNombre.ForeColor = System.Drawing.Color.Black;
                    return _exito;
                }
            }
            else
            {
                _vista.LNombre.ForeColor = System.Drawing.Color.Red;
                return _fallo;
            }
        }

        public int setEdificio()
        {
            //Se inicializa la variable _edificio con el edificio seleccionado por el usuario
            this._edificio = _vista.EdificioSalon.SelectedItem.Text;
            //Se valida si el DropDownList no selecciono ninguna opcion
            if (_edificio != "- Selecciona -")
            {
                _vista.LEdificio.ForeColor = System.Drawing.Color.Black;
                return _exito;
            }
            else
            {
                //Si el _edificio tiene un string "- Selecciona -" significa que el usuario no selecciono nada y da error
                _vista.LEdificio.ForeColor = System.Drawing.Color.Red;
                return _fallo;
            }
        }

        public int setTipo()
        {
            //Se inicializa la variable _tipoSalon con el tipo de salon seleccionado por el usuario
            this._tipoSalon = _vista.TipoSalon.SelectedItem.Text;
            //Se valida si el DropDownList no selecciono ninguna opcion
            if (_tipoSalon != "- Selecciona -")
            {
                _vista.LTipo.ForeColor = System.Drawing.Color.Black;
                return _exito;
            }
            else
            {
                //Si el _tipoSalon tiene un string "- Selecciona -" significa que el usuario no selecciono nada y da error
                _vista.LTipo.ForeColor = System.Drawing.Color.Red;
                return _fallo;
            }
        }

        public int setCapacidad()
        {
            int validacion = 0;
            //Se inicializa la variable _capacidadPrueba con la capacidad insertada por el usuario
            String capacidadPrueba = _vista.CapacidadSalon.Text;
            //Se valida si la capacidad esta vacia
            if (capacidadPrueba!="")
            {
                foreach (char car in capacidadPrueba)
                {
                    //Se valida que todos los caracteres sean numeros
                    if (car < '0' || car > '9')
                    {
                        //Sino son numeros se muestra un mensaje de error
                        _vista.LCapacidad.ForeColor = System.Drawing.Color.Red;
                        validacion = 0;
                        //Se rompe el ciclo ya que hay error y no hay que seguir buscando entre cada caracter
                        break;
                    }
                    else
                    {
                        //Si son numeros entonces se transforma lo que contiene el Textbox a un entero de 32bits 
                        this._capacidadSalon = Int32.Parse(_vista.CapacidadSalon.Text);
                        //Ahora se valida que un salon tenga capacidad entre 10 y 150 puestos
                        if (this._capacidadSalon > 10 & this._capacidadSalon < 150)
                        {
                            //Si la validacion es 1 entonces la capacidad esta dentro del rango
                            _vista.LCapacidad.ForeColor = System.Drawing.Color.Black;
                            validacion = 1;
                        }
                        else
                        {
                            //Sino esta dentro del rango da error
                            _vista.LCapacidad.ForeColor = System.Drawing.Color.Red;
                            validacion = 0;
                        }
                    }
                }
            }
            else
            {
                //Si la capacidad esta vacia hay error porque es un campo obligatorio
                _vista.LCapacidad.ForeColor = System.Drawing.Color.Red;
            }
            return validacion;
        }

        //Metodo que cambia los mensajes de la interfaz cuando falla el insertar de un salon
        public void ocurreError(String info)
        {
            _vista.Error.Text = "Operacion Fallida: " + info;
            _vista.Error.ForeColor = System.Drawing.Color.Red;
            _vista.Error.Visible = true;
        }

        //Metodo que cambia los mensajes de la interfaz cuando se agrega exitosamente un salon
        public void ocurreExito()
        {
            _vista.Error.Text = "El salon se agrego con exito";
            _vista.Error.CssClass = "transaccionExitosa";
            _vista.Error.ForeColor = System.Drawing.Color.Green;
            _vista.Error.Visible = true;
            _vista.LCapacidad.ForeColor = System.Drawing.Color.Black;
            _vista.LNombre.ForeColor = System.Drawing.Color.Black;
            _vista.LEdificio.ForeColor = System.Drawing.Color.Black;
            _vista.LTipo.ForeColor = System.Drawing.Color.Black;
            _vista.CapacidadSalon.Text = "";
            _vista.NombreSalon.Text = "";
            _vista.TipoSalon.SelectedIndex = 0;
            _vista.EdificioSalon.SelectedIndex = 0;
        }

        #endregion Validaciones y obtencion de valores
    }
}